运行此代码时,这是Chrome调试工具中的结果:
需要加载元数据 在Init之后 完成z
我期待“init'之后”只有在“完成的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;
}
}
答案 0 :(得分:4)
.then(console.log('after Init'));
此处您正在调用 console.log
并将结果(undefined
)传递给then
。您需要传递回调函数,就像在initBreezeMetaData
中一样:
dataServiceHelper.initBreezeMetaData().then(function() {
console.log('after Init');
});
return true;
如果initBreezeMetaData
函数返回一个promise,它应该总是返回一个promise。当调用者想要对结果调用.then
方法时,返回布尔值会导致异常...