2017-12-10 17 views
0

私はNodeをかなり使い慣れていて、私はそれを使って外部APIを呼び出すいくつかのFirebase Cloud関数を書いています。私は約束に苦しんでいます。私はコールバックを使用する方法を知っていますが、私はコールバックを約束に変換する方法を理解することはできません。 newJobRequestSubmittedメソッドで約束を利用したいので、ネストされたコールバックがありません。私はまた、最終的なリターン・ステートメントに達する前に関数が終了する場所を持っているという問題を解決することを願っています。ここではメソッドと呼ばれているメソッドの実装がある...コールバックを約束に変換する正しい方法

更新日:

exports.newJobRequestSubmitted = functions.database.ref('/job-requests').onWrite(event => { 

    if (event.data.val() === null) return null; 

    const agilecrmContactRef = event.data.ref.root.child('contacts'); 


    return createWIWJobSite(jobSiteDescription, fullname, jobSiteAddress).then(jobsSiteResult => { 

     return Promise.all([ 
      createCRMDeal(agilecrmContactRef, type, numEmployees, startTime.getTime(), address, fullname, estimatedCost),  
      createWIWShift(notes, utcStartTime, utcEndTime, numEmployees, jobsSiteResult.site.id).then(result => { 

       const userJobRequestsRef = event.data.adminRef.root.child('job-requests-by-user').child(userId).child(firebaseJobId); 

       return Promise.all([ 
        userJobRequestsRef.set({type: type, jobDate: jobDate, wheniworkJobId: result.shift.id, status: 'pending'}),   
       ]).then(_ => true); 

      }).catch(err=> { 

       return Promise.all([ 
        event.data.ref.set(null) 
       ]).then(_ => true); 
      }) 

     ]).then(_ => true); 

    }).catch(err=> { 
     console.log('ERROR = ', err); 
    }); 



}); 






var createCRMDeal = function(contactRef){ 

    const crm = new CRMManager(...); 
    return agilecrmContactRef.once('value').then(snapshot=> { 

     const deal = { 
      ... 
     }; 

     return crm.contactAPI.createDeal(deal, function(result) { 
      console.log('succes creating deal = ', result); 
     }, function(err){ 
      console.log('err creating deal = ', err); 
     }); 

    }); 
}; 


var createWIWJobSite = function(){ 
    const wiw = new WIW(...); 

    return wiw.post('sites', { 
     "location_id": 3795651, 
    }); 

}; 


var createWIWShift = function(jobSiteId){ 

    const wiw = new WIW(...); 

    return wiw.post('shifts', { 
     "site_id": jobSiteId, 
    }); 

}; 
+2

'wiwAPICreateJobSite'は' callback'パラメータを取ってはいけません。 '.post(...)'がすでにあなたに与えることを約束する 'return'だけです! – Bergi

+0

上記のコードを提案して更新しました。しかし、私は約束を一緒に結ぶ方法を理解することができないので、私は上記のようにネストされていません...あなたが非常に感謝する例を示すことができたら – MikeG

+0

あなたのコードに問題のあるネスティングはありません。単一エレメント配列に対して 'Promise.all'を使用することは避けたいかもしれません。' .then(_ => true) 'を' [unnest](https://stackoverflow.com/a/22000931/1048572) 'コール、残りは本当に上手です。 – Bergi

答えて

0

Bergiはすでに利用可能な約束を使用し、コメントしている通り。

しかし、ノード8以降promisifyがあります:

または使用は、青い鳥:

+0

'promisify'は[既存のコールバックAPIを約束に変換するにはどうすればいいですか?](https://stackoverflow.com/q/22519784/1048572)の正解ですが、ここではOPを助けるとは思わないでしょう。 – Bergi

関連する問題