当前位置: 首页 > 知识库问答 >
问题:

如何等待JavaScriptpromise解决后再恢复功能?

干宏邈
2023-03-14

我在测试中到处使用这种模式(不仅仅是加载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>

共有1个答案

桑睿识
2023-03-14

仔细管理基于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特性(如AsyncAwait)的环境中传输代码或运行代码,现在可以使用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