如何使许同步执行?

问题描述 投票:2回答:2

我使用DOM到image.js转换DOM来PNG图像。以DOM对image.js使用承诺,代码异步执行。我想同步执行。那么功能。

我有以下代码:

domtoimage.toPng(document.getElementById("main")).then(function(dataUrl) {
    console.log(dataUrl);
}).catch(function(error) {
    console.error('oops, something went wrong!', error);
});

console.log("this console should be executed after console.log(dataUrl)")

我想首先执行。那么功能时,执行console.log("this console should be executed after console.log(dataUrl)")之前。

请告诉我一些方法来实现这一目标。

javascript promise es6-promise
2个回答
2
投票

对于那些在磕磕绊绊现在这样:

如果你不支持IE而言,你可以使用async and await,就好像是同步执行的承诺。直到承诺解决的await语法将暂停执行该功能,让你写的代码,如果没有一个承诺。为了赶上一个错误,你将它包装在一个try/catch块。

唯一美中不足的是,使用await语法要求你把它包起来与async声明的函数里面。

async function toPng() {
  try {
    let dataUrl = await domtoimage.toPng(document.getElementById("main"));
    console.log(dataUrl);
  }
  catch (error ) {
    console.error('oops, something went wrong!', error);
  }

  console.log("this console should be executed after console.log(dataUrl)")
}

1
投票

当然也有合法的理由来强制JS承诺的同步执行。最明显的是require'ing需要使用一些异步的东西来初始化文件时,和优化是不是一个压倒一切的关注。

好像synchronized-promise好像它应该做的伎俩包。在你的情况(警告 - 未经测试..):

const dti = () => docstoimage.toPng(document.getElementById("main"))
  .then(dataUrl => console.log('url: ', dataUrl))
  .catch(err => console.error('oops: ', err))

const sp = require('synchronized-promise')
const syncDti = sp(dti)
syncDti() // performs the 'synchronized version'

console.log("this console should be executed afterwards")
© www.soinside.com 2019 - 2024. All rights reserved.