Javascript 为什么此调用不等待响应后再继续?

Javascript 为什么此调用不等待响应后再继续?,javascript,promise,Javascript,Promise,当我运行此代码时,这是Chrome调试工具中的结果: 需要加载元数据吗 初始化后 完成z 我原以为“after init”只会在“finished z”代码启动后出现,但它似乎会在启动前返回。为什么会这样?(我不熟悉JS中的承诺和异步编程) Class1.js: function activate() { dataServiceHelper.initBreezeMetaData().then(console.log('after Init')); } data

当我运行此代码时,这是Chrome调试工具中的结果:

需要加载元数据吗 初始化后 完成z

我原以为“after init”只会在“finished z”代码启动后出现,但它似乎会在启动前返回。为什么会这样?(我不熟悉JS中的承诺和异步编程)

Class1.js:

 function activate()
    {
        dataServiceHelper.initBreezeMetaData().then(console.log('after Init'));
    }
dataServiceHelper.js:

function initBreezeMetaData()
{
    if (manager.metadataStore.isEmpty())
    {
        console.log('need to load metadata');
        return manager.fetchMetadata().then(function ()
        {
            console.log('loaded metadata for ' + config.serviceUrl);
        }).fin(function ()
        {
            console.log('finished z');
        });
    } else
    {
        return true;
    }

}
这里您正在调用
console.log
,并将结果(
undefined
)传递到
然后
。您需要传递回调函数,就像在
initBreezeMetaData
中所做的那样:

dataServiceHelper.initBreezeMetaData().then(function() {
    console.log('after Init');
});

如果
initBreezeMetaData
函数返回承诺,则它应始终返回承诺。当调用者想要调用
时,返回布尔值将导致异常。然后对结果调用
方法

这里您正在调用
console.log
,并将结果(
undefined
)传递到
然后
。您需要传递回调函数,就像在
initBreezeMetaData
中所做的那样:

dataServiceHelper.initBreezeMetaData().then(function() {
    console.log('after Init');
});


如果
initBreezeMetaData
函数返回承诺,则它应始终返回承诺。当调用者想要调用
时,返回布尔值会导致异常。然后对结果执行
方法…

太好了,谢谢您的解释。因此,对于您关于始终返回承诺的评论-如果我不总是需要调用manager.fetchMetadata(),我将如何在initBreezeMetaData方法中执行此操作?我不确定该管理器及其元数据存储已经执行了哪些操作,但理论上,您应该记住函数的结果。当第一次调用
initMetaData
时,它将调用管理器获取元数据,并存储该承诺。在取数过程中,将使用存储的、挂起的承诺应答更多的呼叫;在那之后,你就可以回复你的承诺了。太好了,谢谢你的解释。因此,对于您关于始终返回承诺的评论-如果我不总是需要调用manager.fetchMetadata(),我将如何在initBreezeMetaData方法中执行此操作?我不确定该管理器及其元数据存储已经执行了哪些操作,但理论上,您应该记住函数的结果。当第一次调用
initMetaData
时,它将调用管理器获取元数据,并存储该承诺。在取数过程中,将使用存储的、挂起的承诺应答更多的呼叫;在那之后,电话可以返回履行的承诺。
return true;