strongloop promise什么时候执行数据库调用?

时间:2017-03-14 15:28:44

标签: api ecmascript-6 promise loopback

我正在重构别人的代码。

let promiseObj = Application.models.Widget.findById(connection.childId)

    if (connection.child != 'Widget') {
        typeES = "media"
        promiseObj = Application.models.Media.findById(connection.childId)
    }

promiseObj.then((obj) => {
  let ownerId = obj.ownerId
  let promiseUser = Application.models.MyUser.findById(ownerId)
})

问题是,服务器何时被调用 "让promiseObj = Application.models.Widget.findById(connection.childId)"宣布。

或者,当.then被声明为承诺有办法实现时,服务器会被调用。

这是ES6的环回。

谢谢你们/女孩:D

2 个答案:

答案 0 :(得分:2)

  

声明let promiseObj = Application.models.Widget.findById(connection.childId)时是否调用服务器。

是的,一旦调用findById方法,就会发出服务器请求。

  

或者,当.then被声明为承诺有办法实现时,服务器会被调用。

then只是一个名为的方法,此处没有声明。而且它并没有给予承诺一种实现的方式" - 承诺将在请求完成后始终解决(成功时执行并在发生错误时拒绝),无论是否有任何回调。
如果您通过then安装回调,则会在履行承诺时调用它。

所以是的,我很确定你应该重构这段代码:

let promiseObj;
if (connection.child != 'Widget') {
    promiseObj = Application.models.Widget.findById(connection.childId);
} else {
    typeES = "media"
    promiseObj = Application.models.Media.findById(connection.childId)
}

let promiseUser = promiseObj.then((obj) => {
    return Application.models.MyUser.findById(obj.ownerId);
});

答案 1 :(得分:0)

正如Erazihel所解释的那样,声明并没有解决问题,而是在你打电话时调用.then()

我做了一个简单的例子,为了可视化效果,你将检查解析的时间是否与调用.then()的时间相匹配,而不是声明。

p1.then(
    // Then calls the resolve so the execution time 'resolve' matches .then
    function(val) {
        var timeMeAgain =  new Date().toLocaleString();
      log.insertAdjacentHTML('beforeend', val.thisPromiseCount +
        ') Promise done, then is called here (<small>Async call finished, .then called at: '+timeMeAgain+', promise executed at": '+val.timeCalledAt+' </small>)<br/>');
    })

Check the example code here

*代码基于MDN示例。查看文档here

修改

关于resolve方法,正如MDN文档所述:

  

该方法返回一个使用给定值解析的Promise对象。   如果值是一个值(即具有“then”方法),则返回   承诺将“遵循”那种可靠的,采用其最终状态;   否则返回的承诺将用值来实现。

意味着当数据库或端点返回信息时,将返回响应对象,不是声明的声明。