我在测试中到处使用这种模式(不仅仅是加载URL),主要是为了允许发生对DOM的更改(例如mimick单击按钮,并等待divs隐藏和显示)。
这种设计的缺点是,我总是用几行代码编写匿名函数。此外,虽然我有一个解决方案(QUnit的assert.async()
),但定义promise的测试函数在promise运行之前完成。
我想知道是否有任何方法可以从promise
中获取值,或者等待(block/sleep)直到它解决为止,类似于.NET的IAsyncresult.WaitHandle.WaitOne()
。我知道JavaScript是单线程的,但我希望这并不意味着函数不能屈服。
本质上,有没有办法让下面按照正确的顺序吐出结果呢?
function kickOff() {
return new Promise(function(resolve, reject) {
$("#output").append("start");
setTimeout(function() {
resolve();
}, 1000);
}).then(function() {
$("#output").append(" middle");
return " end";
});
};
function getResultFrom(promise) {
// todo
return " end";
}
var promise = kickOff();
var result = getResultFrom(promise);
$("#output").append(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>
仔细管理基于promise的代码可以控制许多异步操作的执行顺序。
我不太清楚您想在代码中实现什么顺序,但您可以使用现有的kickoff()
函数,然后在调用它之后将.then()
处理程序附加到它:
function kickOff() {
return new Promise(function(resolve, reject) {
$("#output").append("start");
setTimeout(function() {
resolve();
}, 1000);
}).then(function() {
$("#output").append(" middle");
return " end";
});
}
kickOff().then(function(result) {
// use the result here
$("#output").append(result);
});
这将以保证的顺序返回输出--如下所示:
start
middle
end
如果您在支持ES7特性(如Async
和Await
)的环境中传输代码或运行代码,现在可以使用Await
使代码“出现”以等待promise的结果。它仍然是在有promise的情况下发展的。它仍然不会阻止所有Javascript,但它允许您以更友好的语法编写顺序操作。
而不是ES6的做事方式:
someFunc().then(someFunc2).then(result => {
// process result here
}).catch(err => {
// process error here
});
您可以这样做:
// returns a promise
async function wrapperFunc() {
try {
let r1 = await someFunc();
let r2 = await someFunc2(r1);
// now process r2
return someValue; // this will be the resolved value of the returned promise
} catch(e) {
console.log(e);
throw e; // let caller know the promise was rejected with this reason
}
}
wrapperFunc().then(result => {
// got final result
}).catch(err => {
// got error
});
问题内容: 我正在做一些单元测试。测试框架将页面加载到iFrame中,然后对该页面运行声明。在每个测试开始之前,我创建一个,将iFrame的事件设置为call ,设置iFrame的事件,并返回promise。 因此,我可以调用,它将在执行任何操作之前等待页面加载。 我在测试中的所有地方都使用了这种模式(不只是用于加载URL),主要是为了允许对DOM进行更改(例如,点击按钮,然后等待divs隐藏和显
我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase
在这里,我试图从mongodb集合中获取最新的记录键p_id值,但得到的错误如下:SyntaxError:await仅在异步函数中有效。那么如何解决这个问题呢? 数据控制器。js:
所以我想知道promise的回应和拒绝对象是怎么回事。我正在阅读这份文档,有些事情我还不清楚。 例如,对象是关于什么的。 我已经看到这个东西可以包含在一个字符串中,然后启动?发生了什么事?这有什么意义 我最初认为只要回调函数返回一个值,解析函数/对象就会启动,然后它就可以转到 所以我在这件事上玩了一段时间,结果证明,我的理论中有50%的时间是有效的,另外50%的时间让我崩溃。 还有拒绝对象/函数,
问题内容: 我有一个使用一些异步功能的节点应用程序。 在继续进行其余的应用程序流程之前,我该如何等待异步功能完成? 下面有一个简单的示例。 在示例中,要返回的元素“ ”必须为5而不是1。如果应用程序不等待异步功能,则等于1。 谢谢 问题答案: 使用回调机制: 使用异步等待
拼命尝试编写https://www.npmjs.com/package/node-firebird#reading-blobs-aasynchronous的同步版本 基本上我需要(a)等两次: 执行回调函数,以便事件发射器可用 为结束事件发生 然后返回Buffer。 我的代码(现在是JS/TS混合代码)当前执行2,但不是1:readBlob返回未定义的,然后Buffer.concat(buffer