Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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承诺使用角度http调用不水合对象_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript承诺使用角度http调用不水合对象

Javascript承诺使用角度http调用不水合对象,javascript,angularjs,promise,Javascript,Angularjs,Promise,我知道我以前做过这件事,但不知怎么的,它不起作用 所以我有一个角度控制器,它调用角度服务,发送和返回数据 在promise中,console.log会吐出数据,但我认为使用。然后它应该将数据保留在外部。然后,对吗 var receipt = this; receipt.airportCode = {}; var xx = ""; airportCodeService.getAirlineFromCarrierId('GH') .then(func

我知道我以前做过这件事,但不知怎么的,它不起作用

所以我有一个角度控制器,它调用角度服务,发送和返回数据

在promise中,console.log会吐出数据,但我认为使用
。然后
它应该将数据保留在外部。然后,对吗

   var receipt = this;

    receipt.airportCode = {};
    var xx = "";

    airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            xx = result;
            receipt.airportCode = result;
        })
        .catch(function () {
            console.log('problem');
        });

        console.log('xx',xx)   // displays only  "xx" 

我用receive.airportCode的console.log获取了>Object{}//,然后尝试为此定义一个范围变量

$scope.xx = "";

airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            $scope.xx = result;
            receipt.airportCode = result;
        })
        .catch(function () {
            console.log('problem');
        });

        console.log('xx',$scope.xx)   

注意:您可能需要在控制器中注入$scope,尝试为此定义一个scope变量

$scope.xx = "";

airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            $scope.xx = result;
            receipt.airportCode = result;
        })
        .catch(function () {
            console.log('problem');
        });

        console.log('xx',$scope.xx)   

注意:当您调用airportCodeService.getAirlineFromCarrierId
时,可能必须在控制器中插入$scope。然后,
承诺不会立即执行。nodejs将执行下一条语句,即
console.log('xx',xx)
。此时,
airportCodeService.getAirlineFromCarrierId
没有响应。通过使用承诺,它不会使异步操作同步

您可以尝试不同的方法使其持久化

如果您想要console.log,您可以使用函数来执行此操作

    var receipt = this;

    receipt.airportCode = {};
    var xx = "";

    function consoleData(data){
       console.log(data);
    }

    airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            xx = result;
            receipt.airportCode = result;
            consoleData(xx);
        })
        .catch(function () {
            console.log('problem');
        });
或者您可以定义一个函数来更改变量的值

    var receipt = this;

    receipt.airportCode = {};
    var xx = "";

    function changexx(data){
       //do something here
       console.log("xx changed",xx);
    }

    airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            changexx(result);
            receipt.airportCode = result;
            consoleData(xx);
        })
        .catch(function () {
            console.log('problem');
        });

您可以研究如何将changeListener附加到对象。但是这会有点过分。

当你调用
机场代码服务时。从CarrierID获取航空线路
。然后
承诺不会立即执行。nodejs将执行下一条语句,即
console.log('xx',xx)
。此时,
airportCodeService.getAirlineFromCarrierId
没有响应。通过使用承诺,它不会使异步操作同步

您可以尝试不同的方法使其持久化

如果您想要console.log,您可以使用函数来执行此操作

    var receipt = this;

    receipt.airportCode = {};
    var xx = "";

    function consoleData(data){
       console.log(data);
    }

    airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            xx = result;
            receipt.airportCode = result;
            consoleData(xx);
        })
        .catch(function () {
            console.log('problem');
        });
或者您可以定义一个函数来更改变量的值

    var receipt = this;

    receipt.airportCode = {};
    var xx = "";

    function changexx(data){
       //do something here
       console.log("xx changed",xx);
    }

    airportCodeService.getAirlineFromCarrierId('GH')
        .then(function (result) {
            console.log(result);
            changexx(result);
            receipt.airportCode = result;
            consoleData(xx);
        })
        .catch(function () {
            console.log('problem');
        });

您可以研究如何将changeListener附加到对象。但这有点过分。

正如Anurag所提到的,异步调用是。。。异步和处理下一个命令不会停止,直到异步调用完成。调用返回
promise
的方法时,要知道
.then
块中的代码是否已运行,唯一的方法是检查
promise
是否已解析

您已经在
中检查和设置了内容。然后,
块,但是当您
控制台时,该块很可能没有被调用/完成。请在最后一行记录结果

这是一件好事。异步调用的全部思想是能够并行地执行多项任务,或者不必担心“什么时候发生什么”

当您确实需要担心异步调用是否已完成时,您只需检查该承诺

显而易见的解决方案是将console.log移动到
。然后
块中。如果您希望在承诺完成后执行某些代码,那么可以在这里执行。您还可以在调用
.getairlinefromcarierid
方法时保留对承诺的引用,然后等待它完成

var xx;
var promise = airportCodeService.getAirlineFromCarrierId('GH').then(function (result) {
    console.log(result);
    xx = result;
    receipt.airportCode = result;
    doStuff(); // This is one way to not clutter your .then with lines of code
}).catch(function () {
    console.log('problem');
});

promise.then(function () { // you can ask your promise any number of times later, if you keep the reference to the promise
    console.log('xx',xx);
})

function doStuff() {
    console.log('xx', xx);
}

正如Anurag所提到的,异步调用是。。。异步和处理下一个命令不会停止,直到异步调用完成。调用返回
promise
的方法时,要知道
.then
块中的代码是否已运行,唯一的方法是检查
promise
是否已解析

您已经在
中检查和设置了内容。然后,
块,但是当您
控制台时,该块很可能没有被调用/完成。请在最后一行记录结果

这是一件好事。异步调用的全部思想是能够并行地执行多项任务,或者不必担心“什么时候发生什么”

当您确实需要担心异步调用是否已完成时,您只需检查该承诺

显而易见的解决方案是将console.log移动到
。然后
块中。如果您希望在承诺完成后执行某些代码,那么可以在这里执行。您还可以在调用
.getairlinefromcarierid
方法时保留对承诺的引用,然后等待它完成

var xx;
var promise = airportCodeService.getAirlineFromCarrierId('GH').then(function (result) {
    console.log(result);
    xx = result;
    receipt.airportCode = result;
    doStuff(); // This is one way to not clutter your .then with lines of code
}).catch(function () {
    console.log('problem');
});

promise.then(function () { // you can ask your promise any number of times later, if you keep the reference to the promise
    console.log('xx',xx);
})

function doStuff() {
    console.log('xx', xx);
}

从这些数据中获取持久性的更好方法是什么?@PeterGrainger对setTimeout的“建议”非常糟糕,因为我非常确定OP现在正在采用这个解决方案……我只是想证明这个值是持久的。只是不是立即,不是说他应该在prod中使用它。删除以避免任何误解。从这些数据中获取持久性的更好方法是什么?@PeterGrainger对setTimeout给出了可怕的“建议”,因为我非常确定OP现在正在采用此解决方案……我只是试图证明该值是持久的。只是不是立即,不是说他应该在产品中使用它。删除以避免任何误解。这被认为是体面的做法吗?我只是在想,当我利用/使用angular框架时——我知道承诺是通过javascript和jquery实现的,如果没有$scope可用——你会怎么做?@PerHornshøj-Schierbeck-还有其他解决方案吗?@JeremyMiller我发布了两个解决方案,如果两者都不适合你,那么我们会错过一些信息(您可能需要提供一个更大的示例/提琴)这被认为是一种体面的做法吗?我只是在想,当我利用/使用angular框架时——我知道承诺是通过javascript和jquery实现的,如果没有$scope可用——你会怎么做?@PerHornshøj-Schierbeck-还有其他解决方案吗?@JeremyMiller我发布了两个解决方案,如果都不适合你,那么我们就错了唱一些信息(您可能需要提供一个更大的示例/小提琴)是的,它将在外部保持,但在方法调用之前不会设置该值