Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 如何在angularJS中观看承诺?_Javascript_Angularjs_Angular Promise - Fatal编程技术网

Javascript 如何在angularJS中观看承诺?

Javascript 如何在angularJS中观看承诺?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,目标:$scope.finalArray=$scope.arrayFromPromise2.concat$scope.arrayFromPromise1 第一种方法 第二种方法 第二种方法将根据getData1的第一个承诺完成的时间抛出错误。 是否可以在getData2中使用$scope.$watch,以便我可以从Promise1中查看$scope.arrayFromPromise1的更改?有什么不同于链接承诺的提示吗 这种肮脏的解决方案会起作用: someService.query1().th

目标:$scope.finalArray=$scope.arrayFromPromise2.concat$scope.arrayFromPromise1

第一种方法

第二种方法

第二种方法将根据getData1的第一个承诺完成的时间抛出错误。
是否可以在getData2中使用$scope.$watch,以便我可以从Promise1中查看$scope.arrayFromPromise1的更改?有什么不同于链接承诺的提示吗

这种肮脏的解决方案会起作用:

someService.query1().then(function (success1) {
    someService.query2().then(function (success2) {
        $scope.finalArray = success1.data.concat(success2.data);
    });
});
使用$watch的第二个解决方案 仍然很脏,但可以工作:

$scope.array1 = [];
$scope.array2 = [];
$scope.finalArray = [];

someService.query1().then(function (success1) {
    $scope.array1 = success.data;
});

$scope.$watchCollection('array1', function (newData, oldData) {
    someService.query2().then(function (success) {
        $scope.finalArray = newData.concat(success.data);
    });
});
清洁剂溶液 使用$q.all等待多个承诺得到解决,然后使用数据做一些事情:

$q.all([someService.query1(), someService.query2()]).then(function (results) {
    $scope.finalArray = results[0].data.concat(results[1].data);
});

这种肮脏的解决方案会奏效:

someService.query1().then(function (success1) {
    someService.query2().then(function (success2) {
        $scope.finalArray = success1.data.concat(success2.data);
    });
});
使用$watch的第二个解决方案 仍然很脏,但可以工作:

$scope.array1 = [];
$scope.array2 = [];
$scope.finalArray = [];

someService.query1().then(function (success1) {
    $scope.array1 = success.data;
});

$scope.$watchCollection('array1', function (newData, oldData) {
    someService.query2().then(function (success) {
        $scope.finalArray = newData.concat(success.data);
    });
});
清洁剂溶液 使用$q.all等待多个承诺得到解决,然后使用数据做一些事情:

$q.all([someService.query1(), someService.query2()]).then(function (results) {
    $scope.finalArray = results[0].data.concat(results[1].data);
});
这个怎么样:

$scope.finalArray = [];

someService.query1()
   .then(function(response){
      $scope.finalArray = $scope.finalArray.concat(response.data);
   });

someService.query2()
   .then(function(response){
      $scope.finalArray = response.data.concat($scope.finalArray);
   });
这两个调用将异步并行完成。只要准备好了,就会改变示波器上的最终光线。为了确保query1的结果放在query2之前,您可以处理要传递的内容,并调用concat

其优点是,一个查询的结果可以在另一个查询停止之前逐渐进入并导致UI更新。如果这实际上对您的业务不利,那么我建议使用以下方法。

如何:

$scope.finalArray = [];

someService.query1()
   .then(function(response){
      $scope.finalArray = $scope.finalArray.concat(response.data);
   });

someService.query2()
   .then(function(response){
      $scope.finalArray = response.data.concat($scope.finalArray);
   });
这两个调用将异步并行完成。只要准备好了,就会改变示波器上的最终光线。为了确保query1的结果放在query2之前,您可以处理要传递的内容,并调用concat


其优点是,一个查询的结果可以在另一个查询停止之前逐渐进入并导致UI更新。如果这实际上对您的业务是不利的,那么我建议您使用来自的方法。

等待一系列承诺完成,然后根据信息采取行动是使用该方法的一项简单任务


使用该方法,等待一系列承诺完成,然后根据这些信息采取行动是一项简单的任务

试一试怎么样:

var promise=promise.all[someService.query1,someService.query2]; 承诺,结果{ $scope.arrayFromPromise1=结果[0]; $scope.arrayFromPromise2=结果[1]; $scope.finalArray=$scope.arrayFromPromise2.concat$scope.arrayFromPromise1; }; 试一试怎么样:

var promise=promise.all[someService.query1,someService.query2]; 承诺,结果{ $scope.arrayFromPromise1=结果[0]; $scope.arrayFromPromise2=结果[1]; $scope.finalArray=$scope.arrayFromPromise2.concat$scope.arrayFromPromise1; }; 您可以使用$q.all等待这两个承诺,然后查看您的结果:

$q.all([someService.query1(), someService.query2()])
.then(function(dataSet) {
  $scope.finalArray = dataSet[0].data.concat(dataSet[1].data);
});
您可以根据需要将此选项用于任意多个承诺。

您可以使用$q.all等待两个承诺,然后查看结果:

$q.all([someService.query1(), someService.query2()])
.then(function(dataSet) {
  $scope.finalArray = dataSet[0].data.concat(dataSet[1].data);
});

您可以根据需要将其用于任意多个承诺。

您是否尝试/考虑过将回拨包括在then中?实际上,第二个getData应该在第二个getData的承诺完成后调用。不确定您的建议,例如?非常简单。使用承诺和回调调用第一个getData getData1,该回调可以是getdata2。getData2还应该包括一个在完成时调用的回调。在第二个回调中,您可以实现concat。我的意思是,你不应该并行触发两个需要在某个时间点收敛的异步进程,除非你有一种机制,可以在完成时将它们同步,就像旧Ada语言中的rendezvous一样。由@fdomig发布的解决方案就是按照我建议的那样序列化这两个调用。我必须指出,我更喜欢一种更清晰的编码方式。问题的标题令人困惑,不能反映文章的内容。请考虑更改它。您尝试/考虑包括回调吗?实际上,第二个getData应该在第二个getData的承诺完成后调用。不确定您的建议,例如?非常简单。使用承诺和回调调用第一个getData getData1,该回调可以是getdata2。getData2还应该包括一个在完成时调用的回调。在第二个回调中,您可以实现concat。我的意思是,你不应该并行触发两个需要在某个时间点收敛的异步进程,除非你有一种机制,可以在完成时将它们同步,就像旧Ada语言中的rendezvous一样。由@fdomig发布的解决方案就是按照我建议的那样序列化这两个调用。我必须指出,我更喜欢一种更清晰的编码方式。问题的标题令人困惑,不能反映文章的内容。请考虑更改它。它仍然是一个链…也许我想执行1个函数/查询,而不是两个。them@VladRadulescu我添加了另一个版本,它监视数组1的变化,然后触发第二个查询。它仍然是一个链…也许我只想执行一个函数/查询,而不是两个them@VladRadulescu我又加了一个
rsion监视数组1的变化,然后触发第二个查询。使用类似本机Promise解决方案的问题是它超出了angulars摘要周期的范围。。。aka angular不知道发生了什么…使用像native Promise solution这样的东西的问题是它超出了angulars摘要周期的范围。。。aka angular不知道发生了什么…您需要从响应中提取.data属性。我会在原始赋值中这样做:让QueryPromise=someService.query1.thenr=>r.data,这样承诺就是对数据的承诺,而不是对响应对象的承诺,或者你可以在concat调用中这样做。@Duncan updated。。。。但这只是一个假设。如前所述,答案更一般。不是伪代码,我在构建链中保留了babeljs,所以我大部分时间使用es2016。同意,它会做出假设,但与原始问题相符。如果某个服务只是从查询中返回数据,而不是传递响应对象,那会更干净。。。喜欢es6代码!您需要从响应中提取.data属性。我会在原始赋值中这样做:让QueryPromise=someService.query1.thenr=>r.data,这样承诺就是对数据的承诺,而不是对响应对象的承诺,或者你可以在concat调用中这样做。@Duncan updated。。。。但这只是一个假设。如前所述,答案更一般。不是伪代码,我在构建链中保留了babeljs,所以我大部分时间使用es2016。同意,它会做出假设,但与原始问题相符。如果某个服务只是从查询中返回数据,而不是传递响应对象,那会更干净。。。喜欢es6代码!谢谢你的信息,杰伦爵士,它真的帮助了我。谢谢你的信息,杰伦爵士,它真的帮助了我。