Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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 如何使包含映射承诺的函数返回承诺?_Javascript_Angularjs_Typescript - Fatal编程技术网

Javascript 如何使包含映射承诺的函数返回承诺?

Javascript 如何使包含映射承诺的函数返回承诺?,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我有一个AngularJS函数: topicsSave = (): ng.IPromise<any> => { var self = this; var defer = self.$q.defer(); var requests = self.topics .map((rowData: any, i: number) => { var deferred = self.$q.defer();

我有一个AngularJS函数:

topicsSave = (): ng.IPromise<any> => {
    var self = this;
    var defer = self.$q.defer();
    var requests = self.topics
        .map((rowData: any, i: number) => {
            var deferred = self.$q.defer();
            var entityId = rowData['topicId'];
            self.$http({ url: self.url,
                method: "PUT",
                data: rowData
            }).then((response: ng.IHttpPromiseCallbackArg<any>): void => {
                // 
                deferred.resolve(response.data);
                }, (error: ng.IHttpPromiseCallbackArg<any>): void => {
                deferred.reject(error);
            });
            return deferred.promise;
        }
            );
    self.$q.all(requests)
        .then(
            (): void => {
                self.topicsForm.$setPristine();
            },
            (): void => {
            });
}
从我看到的情况来看,$q.all返回一个承诺,但是我需要如何设置另一个defer变量并从中进行延迟呢?

的确如此

topicsSave = (): ng.IPromise<any> => {
    ...
    return self.$q.all(requests)
    .then(
        (): void => {
            self.topicsForm.$setPristine();
        },
        (): void => {
            return $q.reject('$q.all rejection reason');
        });
}

你到底为什么需要延期付款?请注意,将延迟与现有承诺结合使用被称为。我将遍历datagrid的行,并对每一行进行保存。每次保存都有一个完成承诺。我使用$q.all来等待所有的承诺保存完成,然后我将网格状态设置为clean。注意,为了简化这个示例,我删除了几行并用//替换它们。执行保存的代码似乎可以正常工作,但是我想让topicsSave函数在完成后返回一个承诺。这是我现在不清楚的地方。我是否需要在self.topicsForm.之后返回$q.resolve?不,承诺已经解决了。如果需要,您可以返回将传递给下一个“then”的数据。这就是为什么延迟在jQuery之外是无用的。