在多个解析期间输出 Promise 的值
Outputting Value of Promise during multiple parses
我正在从 d3.csv 加载一个承诺,然后在后续的 .then 调用中对返回的数组进行多项更改。
我需要在每次更改之前将数组的状态输出到 html (Angular 2),我可以使用(变量 | 异步)执行此操作,但它将更新为每次更改,我需要输出每次更改前的状态。
我试图克隆承诺,但所有克隆都指向同一个承诺。任何变量都超出了更改的范围,并且无法访问父范围。
data = d3.csv promise
data.then(methodB()). // HTML | async Output Required of Array before changes
then(methodB()) // HTML | async Output Required of Array before changes
etc..
etc..
etc..
(There are around 15 methods applied to the data as it is munched and analyzed)
实现此目标的最佳方法是什么?
假设:
- 您有一个名为
csvPromise
的开始承诺,它提供数组
- 要应用的方法有
methodA
、methodB
、methodC
等,每个都接受Array
- 每种方法要么 returns 输入数组的变化,要么通过 Promise
传递变化
- 对数组的更改是累积的,方法对方法
- 你有一个同步函数
output()
,它将接受原始数组和每个变异
那么像这样的模式就可以完成工作:
csvPromise
.then(function(arr) {
output(arr); // observe initial array as delivered by csvPromise
return methodA(arr);
})
.then(function(arr) {
output(arr); // observe array after application of methodA
return methodB(arr);
})
.then(function(arr) {
output(arr); // observe array after application of methodB
return methodC(arr);
})
etc..
etc..
etc..
.then(function(arr) {
output(arr); // observe array after application of final method
}).catch(function(error) {
console.log(error); // any error thrown from anywhere in the chain will arrive here
});
可以通过如下方式动态构建链来程序化该模式:
var methods = [methodA, methodB, methodC, ...]; // list of methods (uncalled at this point)
return methods.reduce(function(promise, method) {
return promise.then(function(arr) {
output(arr); // observe result of previous stage
return method(arr);
});
}, csvPromise)
.then(function(arr) {
output(arr); // observe array after application of final method
}).catch(function(error) {
console.log(error); // any error thrown from anywhere in the chain will arrive here
});
最有可能违反假设的是 output()
本身是 异步,在这种情况下:
var methods = [methodA, methodB, methodC, ...]; // list of methods
return methods.reduce(function(promise, method) {
return promise.then(function(arr) {
return output(arr).then(function() {
return method(arr);
});
});
}, csvPromise)
.then(function(arr) {
output(arr); // observe array after application of final method
}).catch(function(error) {
console.log(error); // any error thrown from anywhere in the chain will arrive here
});
我正在从 d3.csv 加载一个承诺,然后在后续的 .then 调用中对返回的数组进行多项更改。
我需要在每次更改之前将数组的状态输出到 html (Angular 2),我可以使用(变量 | 异步)执行此操作,但它将更新为每次更改,我需要输出每次更改前的状态。
我试图克隆承诺,但所有克隆都指向同一个承诺。任何变量都超出了更改的范围,并且无法访问父范围。
data = d3.csv promise
data.then(methodB()). // HTML | async Output Required of Array before changes
then(methodB()) // HTML | async Output Required of Array before changes
etc..
etc..
etc..
(There are around 15 methods applied to the data as it is munched and analyzed)
实现此目标的最佳方法是什么?
假设:
- 您有一个名为
csvPromise
的开始承诺,它提供数组 - 要应用的方法有
methodA
、methodB
、methodC
等,每个都接受Array - 每种方法要么 returns 输入数组的变化,要么通过 Promise 传递变化
- 对数组的更改是累积的,方法对方法
- 你有一个同步函数
output()
,它将接受原始数组和每个变异
那么像这样的模式就可以完成工作:
csvPromise
.then(function(arr) {
output(arr); // observe initial array as delivered by csvPromise
return methodA(arr);
})
.then(function(arr) {
output(arr); // observe array after application of methodA
return methodB(arr);
})
.then(function(arr) {
output(arr); // observe array after application of methodB
return methodC(arr);
})
etc..
etc..
etc..
.then(function(arr) {
output(arr); // observe array after application of final method
}).catch(function(error) {
console.log(error); // any error thrown from anywhere in the chain will arrive here
});
可以通过如下方式动态构建链来程序化该模式:
var methods = [methodA, methodB, methodC, ...]; // list of methods (uncalled at this point)
return methods.reduce(function(promise, method) {
return promise.then(function(arr) {
output(arr); // observe result of previous stage
return method(arr);
});
}, csvPromise)
.then(function(arr) {
output(arr); // observe array after application of final method
}).catch(function(error) {
console.log(error); // any error thrown from anywhere in the chain will arrive here
});
最有可能违反假设的是 output()
本身是 异步,在这种情况下:
var methods = [methodA, methodB, methodC, ...]; // list of methods
return methods.reduce(function(promise, method) {
return promise.then(function(arr) {
return output(arr).then(function() {
return method(arr);
});
});
}, csvPromise)
.then(function(arr) {
output(arr); // observe array after application of final method
}).catch(function(error) {
console.log(error); // any error thrown from anywhere in the chain will arrive here
});