Javascript JS chained Promise代码语法改变了运行的顺序-为什么?
我正在尝试使用链式承诺按顺序运行异步进程 我从这个开始:Javascript JS chained Promise代码语法改变了运行的顺序-为什么?,javascript,promise,Javascript,Promise,我正在尝试使用链式承诺按顺序运行异步进程 我从这个开始: var dataStore = {}; DBCalls.GetAllProjects() .then((data) => ProcessData.StoreProjects(data,dataStore)) .then(ProcessData.DoStuff(dataStore)) 上述函数在StoreProjects函数之前完成了DoStuff函数。(以错误的顺序运行) 这将以正确的顺序运行函数 有人能解释一下语法上的区别吗 是
var dataStore = {};
DBCalls.GetAllProjects()
.then((data) => ProcessData.StoreProjects(data,dataStore))
.then(ProcessData.DoStuff(dataStore))
上述函数在StoreProjects函数之前完成了DoStuff函数。(以错误的顺序运行)
这将以正确的顺序运行函数
有人能解释一下语法上的区别吗
是因为StoreProjects Resolve没有返回任何内容,而且回调签名不同吗
额外信息:
所有函数都使用返回承诺。如果函数返回承诺,如果要等待承诺解析,然后再转到链中的下一个处理程序,则应在承诺处理程序中使用return语句
var dataStore = {};
return DBCalls.GetAllProjects()
.then((data) => { return ProcessData.StoreProjects(data, dataStore); })
.then(() => { return ProcessData.DoStuff(dataStore); })
在第一段代码中,您立即调用了…DoStuff。当然它会先结束。您没有等到第一个函数完成后才调用它。另外,ProcessData.StoreProjects函数是否返回promise?这就是为什么
.then()
的参数应该始终是函数的原因。将函数作为参数传递是延迟运行回调的方式。因为ProcessData.DoStuff(数据存储)
与()=>{ProcessData.DoStuff(数据存储)}
不同。是的,一个表达式生成调用DoStuff
的函数,另一个表达式是对DoStuff
本身的调用。
var dataStore = {};
return DBCalls.GetAllProjects()
.then((data) => { return ProcessData.StoreProjects(data, dataStore); })
.then(() => { return ProcessData.DoStuff(dataStore); })