如何在for循环中组织承诺,并在javascript函数之间传递参数
How to organise promises in for loop and pass argument between functions in javascript?
我正试图在javascript中实现我的第一个承诺。我有这些函数。每一个功能必须完成才能进入下一步:
F1 --> get Current User Id
and save it to var "MyUserID"
F2 --> getUserEvent (example 10 events)
Go to a for loop for each event
and for each iteration save value to var "EventId"
F3--> Get info for that specific event from facebook
This function has 2 parameters (MyUserID,EventId)
F4--> Get image for that specific event
This function has 1 parameter (EventId)
f5--> Save info to DB
Go back to the loop
要实现这一点,我已经做了以下,但我知道它不工作。如果有任何有承诺经验的人可以为我展示原型,我真的很感激。我不确定如何在函数之间传递参数:
var getMyID = function() {
return new Promise(function(resolve, reject) {
// Get my id from facebook
FB.api('/me', function(response) {
if (response && !response.error) {
console.log("response== "+ JSON.stringify(response));
retuen(response.id);//MyUserId
}
});
});
};
getMyID.then(function(myID) {
FB.api('/me/events', function(response) {
console.log("response== "+ JSON.stringify(response));
for(i=0; i<response.data.length;i++) {
console.log("eventID= "+response.data[i].id);
getEvent(response.data[i].id,myID);
}
});
}).catch(function(error) {
console.log('oh no', error);
}).then(function(eventID,myID) {
FB.api("/"+ eventID , function (response3) {
if (response3 && !response3.error) {
//....
if(myID == response3.owner.id && diff < 0 )
{
//save to DB -- Another place I need to add promise
}
}
});
});
我看到了以下bug:
-
getMyID
返回的promise永远不会被解析或拒绝。 -
getMyID.then
不起作用,因为getMyID
是Function
,而不是Promise
。也许你指的是getMyID().then(...)
- 调用
/me/events
的回调应该返回一个Promise
,这样它是异步的。目前,它将启动对Facebook API的调用,然后立即转到下一个then
处理器。 - 与最终的
then
处理器相同。 - 你应该把
catch
放在最后,这样它就能捕获所有的错误。 - 输入错误,
retuen
代替return
为了DRY,我建议您围绕Facebook API创建一个承诺返回包装器。像这样:
function fbAPIRequest(url) {
return new Promise(function (resolve, reject) {
FB.api(url, function(response) {
if (response && !response.error) {
resolve(response);
} else {
reject(response);
}
});
};
}
这将使你的代码更简单:
var myUserID;
fbAPIRequest('/me')
.then(function (response) {
myUserID = response.id;
return fbAPIRequest('/me/events');
})
.then(function (response) {
var eventPromises = response.data.map(function (data) {
return getEvent(data.id, myUserID);
});
return Promise.all(eventPromises);
})
.catch(function(error) {
console.log('oh no', error);
});
function getEvent(eventID, userID) {
return fbAPIRequest('/' + eventID)
.then(function (response) {
if (response.owner.id === userID && diff < 0) {
return saveToDB(response);
}
});
}
function saveToDB(event) {
return new Promise(...);
}
您会注意到,我通过返回值(这将成为链中的下一个回调所消耗的值)、返回将解析为值的承诺或利用闭包(如设置myUserID
变量)在回调之间传递数据。
相关文章:
- 从函数JavaScript返回不可变数组/对象
- 将对象传递给函数.JavaScript
- 如何定义const函数javascript(语法糖)
- 新的日期函数javascript
- TypeError:this.getAttribute不是一个函数-javascript
- 从函数javascript发送变量
- 扩展自容器函数Javascript
- 从内部函数javascript内部分配外部函数的对象
- 使用函数JavaScript中的函数
- 在这里使用回调函数(JavaScript)有什么好处吗
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 将“e”传递给一个新函数 - javascript
- 调用函数中的一个函数——Javascript
- 传递的变量不适用于我的函数-Javascript
- 如何将类方法设置为等于多个函数?-Javascript
- 显示php中的函数javascript
- 如何使用php代码创建函数Javascript弹出框
- 未调用的外部函数-javascript
- 如何在类中运行函数.Javascript
- 关闭mouseover上的一个函数——Javascript,jQuery