Javascript 我如何检查我的函数是否加载了一个不正常的承诺?

Javascript 我如何检查我的函数是否加载了一个不正常的承诺?,javascript,Javascript,我想加载两个不同文件中的函数。功能B取决于功能A是否可用 通常我会简单地按顺序加载文件。但是,我是一名WordPress开发人员,有第三方JavaScript“优化”插件,有时会混淆顺序,让我的脚本失败 一位Stackoverflow专家写信给我,但对我来说,承诺就像电影的宗旨一样。在某种程度上,所有这些看起来都是合乎逻辑的,但只要我想仔细考虑,我就无法想出合乎逻辑的解决方案 以下解决方案仅在以正确的顺序加载两个时有效, 但反过来也不行 // a.js // this is in one fil

我想加载两个不同文件中的函数。功能B取决于功能A是否可用

通常我会简单地按顺序加载文件。但是,我是一名WordPress开发人员,有第三方JavaScript“优化”插件,有时会混淆顺序,让我的脚本失败

一位Stackoverflow专家写信给我,但对我来说,承诺就像电影的宗旨一样。在某种程度上,所有这些看起来都是合乎逻辑的,但只要我想仔细考虑,我就无法想出合乎逻辑的解决方案

以下解决方案仅在以正确的顺序加载两个时有效, 但反过来也不行

// a.js
// this is in one file with function A

let isMyFunctionReady = Promise.resolve(true);

// b.js
// this is in another file with function B
isMyFunctionReady.then(function(){
    console.log('Yes, my function is ready, I can now use it.');
}).catch(function () {
    console.log('Couldnt load my function');
})
但是,以下方法行不通:

// b.js
// this is in another file with function B
isMyFunctionReady.then(function(){
    console.log('Yes, my function is ready, I can now use it.');
}).catch(function () {
    console.log('Couldnt load my function');
})

// a.js
// this is in one file with function A
let isMyFunctionReady = Promise.resolve(true);
我知道我可以通过超时来完成这项工作,每隔50毫秒左右轮询一次,看看函数a是否存在。但这不是我想要的

我觉得或许可以使用jquerydeliver。但再一次,对我来说,这就像特尼特一样清楚


我该怎么做呢?

如果你不能控制执行顺序,那么一个承诺在这方面确实帮不了你。相反,每个脚本都需要先查看它是否被执行,然后设置自定义的独立于订单的模块依赖系统。看看这本书,寻找灵感。您可以使用实现它的库之一(如require.js)或创建自己的库

为了简单起见,我将在这里展示jQuery deferreds1的用法:


1:当然,这假设jQuery总是可用的。如果没有,您还必须将延迟对象的代码也放在“共享部分”中。

Hi,Async and wait dosent work??可能。我对async不够熟悉,正在等待了解。我会研究一下。如果你想给我看你所有的代码,我会尽我所能帮助你这些脚本是如何加载的?
async
/
await
实际上只是语法上的甜言蜜语而不是承诺,所以我认为它不适用于承诺,我怀疑它适用于
async
/
await
…非常感谢!
// file a.js
/* the shared part: */
if (!window.isMyFunctionReady) window.isMyFunctionReady = $.Deferred();

/* the definition part: */
window.isMyFunctionReady.resolve(true);
// file b.js
/* the shared part: */
if (!window.isMyFunctionReady) window.isMyFunctionReady = $.Deferred();

/* the usage part: */
window.isMyFunctionReady.promise().then(value => {
    console.log(`Yes, my function ${value} is ready, I can now use it`);
}).catch(err => {
    console.log(err.message);
});
// optional:
setTimeout(() => {
    window.isMyFunctionReady.reject(new Error("Didn't load in time"));
}, 1000);