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