如何等待函数在angularJS中完成执行?

How to wait for a function to finish it's execution in angularJS?

提问人:Araf 提问时间:6/23/2020 最后编辑:Araf 更新时间:6/23/2020 访问量:1057

问:

我有一个名为函数,如果用户有效,如果用户无效,它会返回。我需要从其他地方调用此函数并在条件中使用结果。validityCheck()validinvalidif-else

下面是函数定义(此函数以普通库名称定义):javascriptlibrary.js

function validityCheck(userid, serviceid, system) {
    $(document).ready(function () {
        $.get("https:*******userValidation?serviceid=" + serviceid + "&userid=" + userid + "&system=" + system, function (data, status) {
            console.log(data);
            return data[0];
        });

    });
}

现在我想这样做(此代码部分位于我的项目中):controller

var validity = validityCheck($scope.userid, serviceid, 'abc');
if(validity=="VALID"){
    //do something
}else{
    //do something
}

我需要等到我得到数据。我想我需要使用callback_或类似的东西,但我不知道该怎么做。

JavaScript AngularJS 异步

评论

0赞 Son Nguyen 6/23/2020
你不需要也不应该将检查放在 $.ready 中,在主作用域中定义它,或者更好地将其公开为服务。将代码包装在 promise 中以供重用。不要使用 $.get,而是使用 angular $http。如果可以的话,避免使用 jquery
0赞 Araf 6/23/2020
@SonNguyen实际上,该函数是一个函数,并在其中定义了一个普通文件。我已经包含了该库,并且必须使用该函数。validityCheck()javascriptlibrary.jsjavascript
0赞 Son Nguyen 6/23/2020
如果您打算只运行一次该函数($.ready 只触发一次)并且不重用它,那么很好,但您需要修改代码以用于您自己的代码。如果您不熟悉 promise,目前最快的方法是在函数中插入结果检查(在 console.log(data) 之后)
0赞 Araf 6/23/2020
@SonNguyen实际上我需要在我的项目中检查它。不能在函数内部执行此操作validityCheck()

答:

1赞 Jay Lord Ibe 6/23/2020 #1

为什么不返回 angularjs 的 promise 并像这样在您的代码中使用呢?$httpthen

function validityCheck(userid, serviceid, system) {
    let params = {
        userid: userid,
        serviceid: serviceid,
        system: system
    };
    let request = {
        url: "https:*******userValidation",
        method: "GET",
        headers: {"Content-Type": "application/x-www-form-urlencoded"},
        params: params
    };

    return $http(request).then((response) => {
        return response.data[0] ? response.data[0] : '';
    });
}

用法:

validityCheck($scope.userid, serviceid, 'abc').then((validity) => {
    if (validity === "VALID") {
        //do something
    } else {
        //do something
    }
});

P.S. 别忘了注入angularjs $http

更新:在角度中注册库.js

(function () {
    "use strict";

    angular
        .module("yourAngularModuleName")
        .factory("LibraryFactory", LibraryFactory);

        function LibraryFactory($http) {
            // Add your functions here...
        }

})();

更新:使用现有代码的纯 JavaScript

function validityCheck(userid, serviceid, system) {
    return new Promise((resolve, reject) => {
        $.get("https:*******userValidation?serviceid=" + serviceid + "&userid=" + userid + "&system=" + system, function (data, status) {
            console.log(data);
            resolve(data[0]);
        });
    });
}

在我提供的 USAGE 中使用相同的代码。

评论

0赞 Araf 6/23/2020
该函数在文件中定义。而且我实际上不知道如何在请求中使用。validityCheck($scope.userid, serviceid, 'abc')javascriptpromisejavascripthttp
0赞 Jay Lord Ibe 6/23/2020
由于我可以在您的代码中看到您正在使用 $scope,因此我可以说您已经在 angular 模块中注册了库.js。你能给我看看库.js的内容吗?
0赞 Araf 6/23/2020
这是场景,尽管我已经在问题中描述过:我有定义函数的普通库名称。现在,我已经包含在我的项目中,我必须从我的项目中调用此函数并使用返回的结果。定义了两个函数,一个是,另一个是重定向到基本 URL。javascriptlibrary.jsvalidityCheck(userid, serviceid, system)library.jsangularJSvalidityCheck(userid, serviceid, system)library.jsvalidityCheck($scope.userid, serviceid, 'abc')redTobaseURL()
0赞 Jay Lord Ibe 6/23/2020
你是如何将库.js包含到你的角度项目中的?您是否在 angular 模块中将其注册为控制器、服务或工厂?
1赞 Jay Lord Ibe 6/23/2020
@Araf我建议您将 library.js 注册到您的 angular 应用程序,以便您可以在库中使用其功能.js。我已经更新了上面的答案,以显示如何注册您的 javascript。