Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个异步函数后的回调_Javascript_Asynchronous_Callback - Fatal编程技术网

Javascript 两个异步函数后的回调

Javascript 两个异步函数后的回调,javascript,asynchronous,callback,Javascript,Asynchronous,Callback,在我的两个html2canvas被调用后,我想调用useScreeenshots function Main() { var screenshot1, screenshot2; html2canvas($('#div1'), { onrendered: function (canvas) { screenshot1 = canvas.toDataURL('image/png'); } });

在我的两个
html2canvas
被调用后,我想调用
useScreeenshots

function Main()
{
    var screenshot1, screenshot2;

    html2canvas($('#div1'),
    {
        onrendered: function (canvas)
        {
            screenshot1 = canvas.toDataURL('image/png');
        }
    });

    html2canvas($('#div2'),
    {
        onrendered: function (canvas)
        {
            screenshot2 = canvas.toDataURL('image/png');
        }
    });

    UseScreenshots(screenshot1, screenshot2);
}
在上面的示例中,
screenshot1
screenshot2
在调用
use screenshots
时仍将是
undefined


按照deceze的回答,我将使用:


承诺可以非常优雅地解决这个问题:

Promise.all([new Promise(Function1), new Promise(Function2)]).then(Function3);
请参阅。
您需要调整
Function1
Function2
以正确使用承诺,或者甚至返回承诺本身,或者适当地包装承诺

创建一个承诺的示例:

new Promise(function (resolve) {
    html2canvas($('#div1'), {
        onrendered: function (canvas) {
            resolve(canvas.toDataURL('image/png'));
        }
    });
})
您将在
中以数组的形式接收解析的值。然后
回调:

Promise.all([..]).then(function (screens) { UseScreenshots(screens[0], screens[1]); });

代码对我来说没有多大意义。你能想出SSCCE吗?谢谢,但它说不能得到IE的支持,这对我来说是个问题。我添加了一个例子。请务必阅读文档以熟悉承诺作为一个概念。有一些独立的承诺实现可以作为IE的polyfill的依赖项添加。
Promise.all([..]).then(function (screens) { UseScreenshots(screens[0], screens[1]); });