首页 > 解决方案 > 等待 getScript 而不链接回调

问题描述

我有一个设置功能,我想像这样使用:

async function setup()       
{
    // Load the TF libs, then on complete - create the model.
    await loadTensorFlowLibraries();
    await createModel();
    await load();
    await train();
}

我的第一个函数导入一些外部脚本,如下所示:

function loadTensorFlowLibraries() {

    $.when(
        $.getScript( "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js" ),
        $.getScript( "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js" ),
        $.Deferred(function( deferred ){
            $( deferred.resolve );
        })
    ).done(function(){
        console.log("Scripts loaded");
    });
}

由于此函数异步运行,createModel()因此在完成之前执行loadTensorFlowLibraries()并且脚本失败。

为了解决这个问题,我可以loadTensorFlowLibraries像这样传递一个回调函数:

function loadTensorFlowLibraries(onComplete) {

    $.when(
        $.getScript( "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js" ),
        $.getScript( "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js" ),
        $.getScript( "uploads/michaelryan/data.js"),
        $.Deferred(function( deferred ){
            $( deferred.resolve );
        })
    ).done(function(){
        console.log("Scripts loaded");
        onComplete();
    });
} 

这里的问题是我必须像这样将所有功能链接在一起,例如

function setup()       
{
    // Load the TF libs, then on complete - create the model.
    loadTensorFlowLibraries(createModel(load(train)));
}

谁能指出我如何像我的第一个示例那样设计脚本?

标签: javascriptasynchronousasync-await

解决方案


$.when返回一个类似 Promise 的对象,因此您可以return从每个子函数中获取它:

function loadTensorFlowLibraries() {
    return $.when(
        $.getScript( "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js" ),
        $.getScript( "https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-vis@1.0.2/dist/tfjs-vis.umd.min.js" )
    );
}

然后你可以await在你的setup函数中使用它,就像你在初始代码块中所做的那样。


推荐阅读