使用单独的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返回的消息数组。