【发布时间】:2017-03-12 20:45:29
【问题描述】:
我已经定义了这个函数:
// retrieves zip of package manifest supplied
var retrieveZip = function(metadataClient, args, callback) {
metadataClient.retrieve(args, function(err, result) {
metadataClient.checkRetrieveStatus({id: result.result.id, includeZip: 'true'}, function(err, result) {
if(result.result.done) {
return callback(result);
}
// else check again!(how??)
});
});
}
retrieveZip(metadataClient, args, function(result) {
console.log(result);
});
这个想法是客户端将尝试根据 args 中提供的元数据检索 zip 文件。 API 文档 (Salesforce SOAP API) 要求将在检索方法的结果中提供的 id 传递到检查状态函数。
但是问题是这样的:
-
在第一次检查时,如果结果是“完成”,那么只需将来自
checkRetreiveStatus的结果对象返回到回调(包含结果) -
但是如果结果没有完成,我需要再次调用
checkRetrieveStatus...从内部checkRetrieveStatus -
天真的方法是将原始
checkRetrieveStatus调用中的参数传递给checkRetrieveStatus的新实例,但显然不可能知道这将被调用多少次。
听起来我需要一个递归解决方案?使用 while 循环会不会引入异步调用问题?
【问题讨论】:
-
调用一个函数并将回调传递给它。成功调用
callback,内部回调,调用self(下一次迭代)。 -
值得注意的是,递归在理论上是无限的。您可以为递归函数传递一个计数器,但想法是您不需要知道 cal 的数量。
标签: javascript node.js asynchronous recursion