2017-01-20 23 views
-1

を持つべきであるよりも多くの引数を指定してコールバックを渡す:代わりにコールバックとしてその無名関数を渡すのは、それが私には、以下の機能を持っている

function getRandomTweetFromLocation(geocode) { 
    return new Promise(function (resolve, reject) { 
     var count = 50; 
     T.get('search/tweets', { 
      q: geocode, 
      count: count 
     }, function (err, data, response) { 

、私はまた、err, data, responseを受け取ることになる別の関数を渡したいが、それ約束を解決するためにresolve, rejectを受け取る必要があります。私はこのような機能を書いている:

function chooseAGoodTweet(err, data, response, resolve, reject) { 

が、私はコールバックとしてその名を渡した場合、それだけでerr, data, responseが届きます。コールバックとして渡す方法はありますか?resolverejectを一緒にしますか?

+0

元のコールバックでラッパー関数を使用する必要がありますが、何を試しましたか? – GMaiolo

+0

@Goliadkin私はそれを考えましたが、ラッパーはerr、data、responseだけを受け取るでしょう。残りをする方法??? – Gatonito

+0

あなたはもっとコードを表示してください - あなたはコールバックとして無名関数を渡すことに言及していますが、そのような関数はありません。いずれにしても、プロミスチェーニングであなたが望むものを達成することができます。 – Alnitak

答えて

3

まず、promiseラッパーにT.get()をラップしてから、その約束ラッパーを使用して関数の結果を取得する必要があります。

第2に、1つの引数で複数の引数を渡す場合は、それらの複数の引数をオブジェクトに入れてオブジェクトで解決することを約束します。

// make promise-returning version of T.get() 
function tGetAsync(geocode, cnt) { 
    return new Promise(function (resolve, reject) { 
     T.get('search/tweets', {q: geocode, count: cnt}, function (err, data, response) { 
      if (err) return reject(err); 
      // put multiple results into an object and resolve with that single object 
      resolve({data: data, response: response}); 
     }); 
    }); 
} 

ザ・は、あなたがこのようなことを使用することができます:ここにあなたがいることを行うことができます方法です

tGetAsync(someGeoCode, someCnt).then(function(result) { 
    console.log(result.data); 
    console.log(result.response); 
}).catch(function(err) { 
    console.err(err); 
}); 

あなたはchooseAGoodTweet()が行うことになっているものは表示されませんが、それはこのようにtGetAsync()を使用することができます:

function chooseAGoodTweet(geocode) { 
    return tGetAsync(geoCode, 50).then(function(result) { 
     // do some processing of result.data or result.response 
     // and return a value here 
     return someTweet; 
    }); 
} 

その後、あなたはとしてそれを使用します。

chooseAGoodTweet(someGeoCode).then(function(tweet) { 
    // process chosen tweet here 
}).catch(function(err) { 
    // handle error here 
}); 

コールバックとして渡すことはできますが、解決と拒否を一緒にする方法はありますか?

コールバックを呼び出す関数の外側からコールバックを渡す内容を変更することはできません。単にそれを行う方法はありません。コールバックを呼び出す関数を編集して、コールバックに渡す内容を変更するか、または予想されるコールバック引数を取得するスタブコールバックを挿入して、さらにいくつかを追加してコールバックを呼び出すことができます。

しかし、この場合、約束がどのように機能するのか誤解されているように見えるので、まずその権利を取得してから適切な議論をする必要があります。

+0

私はエラー、データ、レスポンスを解決したくありません。 funciton chooseAGoodTweetはエラー、データ、レスポンスを使ってデータから1つのツイートだけを選択して解決します – Gatonito

+0

解決策はただ1つを解決し、2回以上使用できず、エラー、データ、応答、戻りを解読することでした。ちょうど1つのつぶやき、その1回、 – Gatonito

+0

@Gatonito - 私は私の答えにいくつかの情報を追加しました。あなたは 'chooseAGoodTweet()'が実際に何をしたいかについて何も表示しませんが、 'tGetAsync()'をどのように呼び出して使用するかを示しました。注:非約束APIに約束を追加して最下位レベルに約束を追加し、独自の実装で約束の実装を使用し、アプリケーション固有のロジックを現在のレイヤーに追加しないと、良い設計パターンとみなされます約束する。だから私は 'tGetAsync()'を約束しただけです。次に、あなたのアプリケーション固有のロジックを 'chooseAGoodTweet()'に実装します。 – jfriend00

関連する問題