使用单独的API调用将消息列表存储在数组中

所以基本上我有一个函数,使一个API调用,让我的消息ID列表如下:

function getMessageList(auth) { api.users.messages.list({ auth: auth, userId: 'me', }, function(err, response) { if (err) { console.log('The API returned an error: ' + err); return; } var messages = response.messages; if (messages.length == 0) { console.log('No messages found.'); } else { console.log('messages:'); var messageList = []; for (var i = 0; i < messages.length; i++) { var message = messages[i].id; getMessage(auth, message, function(response) { messageList.push(response); console.log(messageList); }); } } }); } 

使用该ID列表,我需要拨打每个个人ID来获取消息内容,如下所示:

 function getMessage(auth, messageId, callback) { api.users.messages.get({ auth: auth, userId: 'me', id: messageId }, function(err, response) { if(err) {console.log(err); } callback(response); }); } 

基本上,我想能够创build一个消息数组,我正在做的那个callack,但也能够在callback函数外使用它。 可能有点愚蠢的问题,但我有点生疏我的JS。

我想把这个循环放在一个单独的函数(generateMessageList())和使用then()的承诺,但我不能得到这个工作…也许我的语法是closures的。 这是它的样子:

 function generateMessageList(auth, messages) { var messageList = []; for (var i = 0; i < messages.length; i++) { var message = messages[i].id; getMessage(auth, message, function(response) { messageList.push(response); }); } return messageList; } 

我试着generateMessageList(auth, messages).then(console.log(messageList)); 无济于事。

不知道正确的方法是什么,任何指导将不胜感激。

您的代码在本质上是asynchronous使用承诺。 一个很好的例子是bluebird.So基本上包装承诺,然后每个承诺将从请求中的catch块成功或错误返回一个对象。 做任何感觉?

 var Promise = require('bluebird'); function generateMessageList(auth, messages) { function getMessage(auth, messageId) { return new Promise(function(resolve,reject){ api.users.messages.get({ auth: auth, userId: 'me', id: messageId }, function(err, response) { if(err) {reject(err);} resolve(response); }); }); } 

然后在你的generateMessageList(auth, messages)

 function generateMessageList(auth, messages) { var messageList = []; return new Promise(function(resolve,reject){ for (var i = 0; i < messages.length; i++) { var message = messages[i].id; var promise = getMessage(auth, message); promise.then(function(result){ messageList.push(result);}).catch(function(err){reject(err);}); } resolve(messageList); }); 

}

那么你在哪里调用generateMessageList(auth, messages)

只要打电话,然后用消息列表捕捉返回的承诺。

你在一个循环中做一个asynchronousapi调用,循环结束后,结果将会在那里,messageList将是空的。 我会build议你让自己的脑袋承诺或observables,与他们,你可以轻松地等待,直到所有的API调用完成,并将结果映射到一个数组。

只是一个小小的说明:为什么你要做每个消息ID一个API调用,只是做一个API调用所有消息ID,并让API返回的消息数组。