我有以下功能:
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
。有没有办法将其作为回调传递但是让resolve
和reject
一起使用?
答案 0 :(得分:3)
首先,你需要在promise包装器中包装T.get()
,然后使用该promise包装器来获取函数的结果。
其次,promises只能用一个参数解析,所以如果你想向它们传递多个参数,你可以将这些多个参数放入一个对象中并使用该对象解析。这是你可以做到的一种方式:
// 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
});
有没有办法将其作为回调传递但是要解决并拒绝一起去?
您无法更改从调用回调函数外部传递回调的内容。没有办法做到这一点。您可以编辑调用回调的函数来更改传递给回调的函数,也可以插入获取预期回调参数的存根回调,然后再添加一些来调用回调。
但是,在这种情况下,你似乎只是误解了承诺如何运作,所以你需要首先做到正确,然后才能有正确的论据。