2017-12-02 8 views
0

私はFirebase関数で約束を返す関数を作成しようとしていますが、同期は成功しませんが、成功しません。Javascript:約束を返すwrite関数

ここに私が書いた機能です:

function doSomethingLong(param) { 
    https.get('http://www.myurl.com?param=' + param, (resp) => { 
     let data = ''; 

     // A chunk of data has been recieved. 
     resp.on('data', (chunk) => { 
      data += chunk; 
     }); 

     // The whole response has been received. Print out the result. 
     resp.on('end',() => { 
      console.log("Call succeeded. Response: " + data); 
      return true; 
     }); 
    }).on("error", (err) => { 
     console.log("Call failed. Error: " + err.message); 
     return false; 
    }); 
} 

を私はFirebase内の特定の変更が発生したときに、それを呼び出して、それが完了するまで待って、何かしたい:どんなに何

exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => { 
    const param = event.data.val(); 

    if (doSomethingLong(param)) { 
     console.log("ttt"); 
    } else { 
     console.log("fff"); 
    } 
    return null; 
}) 

は、私は試して、の機能が終了する前にdoSomethingLongが終了します。

手がかりはありますか?

+0

だから、doSomethingLongを実行してから1回(「終わり」)が発生し、結果「data」を関数someFunctionに渡しますか? – KostasX

+0

私が誤解していない場合、これはあなたが達成しようとしているものです:https://pastebin.com/hS5Bt8tY – KostasX

+0

(元の質問に誤解を与える誤植がいくつか修正されました)。 @ KostasX、私が達成しようとしているのは:someFunctionが呼び出されたときに、doSomethingLongを呼び出して、完了するのを待ってから、それが戻ってくるはずです。 – user2145097

答えて

2

プロミスを作成し、非同期タスクが終了したときにプロミスを解決/拒否する必要があります。今

function doSomethingLong(param) { 

    return new Promise(function(resolve, reject){ 

     https.get('http://www.myurl.com?param=' + param, (resp) => { 
      let data = ''; 

      // A chunk of data has been recieved. 
      resp.on('data', (chunk) => { 
       data += chunk; 
      }); 

      // The whole response has been received. Print out the result. 
      resp.on('end',() => { 
       console.log("Call succeeded. Response: " + data); 
       resolve(); 
      }); 
     }).on("error", (err) => { 
      console.log("Call failed. Error: " + err.message); 
      reject(err); 
     }); 
    }); 
} 

あなたのような何かをするこの

doSomethingLong() 
    .then(function() { 
     console.log(pased) 
    }, 

    function(err) { 
    console.log(err) 
    } 

) 
0

のようにそれを使用することができ、

function doSomethingLong(param) { 
    return new Promise(function(resolve,reject){ 
     https.get('http://www.myurl.com?param=' + param, (resp) => { 
      let data = ''; 

      // A chunk of data has been recieved. 
      resp.on('data', (chunk) => { 
       data += chunk; 
      }); 

      // The whole response has been received. Print out the result. 
      resp.on('end',() => { 
       console.log("Call succeeded. Response: " + data); 
       resolve(data);//resolve data 
      }); 
     }).on("error", (err) => { 
      console.log("Call failed. Error: " + err.message); 
      reject(err);//reject(reason) 
     }); 
    }); 
} 


exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => { 
    const param = event.data.val(); 

    if (addUserToNewsletter(user_id, name, email, language)) { 
     console.log("ttt"); 
    } else { 
     console.log("fff"); 
    } 
    return null; 
    let promise=doSomethingLong('foo'); 
    promise.then((data)=>{ 
     console.log(data); 
    }).catch((err)=>{ 
     console.log(err); 
    }) 
}) 
0

あなたは約束、promise.resolveまたはpromise.rejectを返すことによって、それらの両方アップに参加することができ。

作るこのようなあなたのコードを見て何か:

this.props.doSomethingLong(loginResult.credential) 
      .then(result => this.someFunction(result)) 
      .catch(error => this.handleError(error.message)) 

はこれをやって:

exports.someFunction = functions.database.ref('/users/{user_id}/param').onCreate(event => { 
const param = event.data.val(); 

if (addUserToNewsletter(user_id, name, email, language)) { 
    console.log("ttt"); 
} else { 
    console.log("fff"); 
} 
return Promise.resolve(); 

})

この各関数呼び出しを行って、あなたは約束と方法についての詳細を読むことができ、それらNode-js

関連する問題