Javascript承诺使用角度http调用不水合对象
我知道我以前做过这件事,但不知怎么的,它不起作用 所以我有一个角度控制器,它调用角度服务,发送和返回数据 在promise中,console.log会吐出数据,但我认为使用Javascript承诺使用角度http调用不水合对象,javascript,angularjs,promise,Javascript,Angularjs,Promise,我知道我以前做过这件事,但不知怎么的,它不起作用 所以我有一个角度控制器,它调用角度服务,发送和返回数据 在promise中,console.log会吐出数据,但我认为使用。然后它应该将数据保留在外部。然后,对吗 var receipt = this; receipt.airportCode = {}; var xx = ""; airportCodeService.getAirlineFromCarrierId('GH') .then(func
。然后它应该将数据保留在外部。然后,对吗
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我发布了两个解决方案,如果都不适合你,那么我们就错了唱一些信息(您可能需要提供一个更大的示例/小提琴)是的,它将在外部保持,但在方法调用之前不会设置该值