传递回调的参数多于应有的参数

时间:2017-01-20 17:56:14

标签: javascript asynchronous callback promise arguments

我有以下功能:

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一起使用?

1 个答案:

答案 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
});
  

有没有办法将其作为回调传递但是要解决并拒绝一起去?

您无法更改从调用回调函数外部传递回调的内容。没有办法做到这一点。您可以编辑调用回调的函数来更改传递给回调的函数,也可以插入获取预期回调参数的存根回调,然后再添加一些来调用回调。

但是,在这种情况下,你似乎只是误解了承诺如何运作,所以你需要首先做到正确,然后才能有正确的论据。