我有一个异步函数getDataItem
,该函数返回一个promise,并将数据传递到另一个函数preparePhysicianSchemaData
,该函数physicianDetailsObj
根据传递的数据以及为初始传递的每一行数据在其中调用另一个异步函数后获取的数据构建一个全局对象。
getDataItem(listID, itemID).then(preparePhysicianSchemaData)
仅在physicianDetailsObj
完全填充了全局对象变量之后,才需要调用另一个函数buildSEOSchemaBlock()
,其功能是解析physicianDetailsObj
对象并构建所需的最终对象。
我宁愿不使用setTimeOut尝试计时:
setTimeout(function(){ return getListItem(listID, itemID).then(preparePhysicianSchemaData) }, 10);
setTimeout(function(){ return buildPhysicianSchemaBlock() }, 3000);
我如何像这样链接最后一个函数:getDataItem(listID, itemID).then(preparePhysicianSchemaData).then(buildPhysicianSchemaBlock)
确保最后一个函数仅在physicianDetailsObj
完全填充全局对象变量之后运行?
var physicianDetailsObj = {};
function getListItem() {} //returns promise
function preparePhysicianSchemaData(item) {
var tempPhysicianDetailsObj = {};
var currentPhysicianItemId = item.get_id();
tempPhysicianDetailsObj = {
"name" : item.get_item("Title"),
"url" : item.get_item("SEOCanonicalHref").match('href="([^"]+)')[1]
};
var currentItemPhysicianTag= item.get_item("PhysicianItemTag").get_label();
getPhysicianLocationDetailsFromServiceLocations(currentItemPhysicianTag).then(function(slitems) {
console.log(slitems);
var slitemEnum = slitems.getEnumerator();
//first empty the object
Object.keys(physicianDetailsObj).forEach(k => delete physicianDetailsObj[k]);
while (slitemEnum.moveNext()) {
var slitem = slitemEnum.get_current();
physicianDetailsObj[currentPhysicianItemId + '-' + slitem.get_id()] = {
"name": tempPhysicianDetailsObj["name"],
"image": tempPhysicianDetailsObj["image"],
"url": tempPhysicianDetailsObj["url"],
"streetAddress": slitem.get_item("LocationAddress"),
"addressLocality": slitem.get_item("LocationLU_x003A_LocationCity").get_lookupValue()
}
}
});
}
function buildSEOSchemaBlock(){ } //process physicianDetailsObj
getPhysicianLocationDetailsFromServiceLocations
是一个异步函数,在内部被调用 preparePhysicianSchemaData
如果preparePhysicianSchemaData
是同步的,则无需等待它,只需在它之后执行操作即可。像这样:
getListItem(listID, itemID).then(function() {
preparePhysicianSchemaData();
buildPhysicianSchemaBlock();
});
或者,如果您需要Promise的结果,例如:
getListItem(listID, itemID).then(function(result) {
preparePhysicianSchemaData(result);
buildPhysicianSchemaBlock();
});
如果它是异步的,则可以链接Promises,例如:
getListItem(listID, itemID)
.then(function(result) { return preparePhysicianSchemaData(result); })
.then(function(newResult) { return buildPhysicianSchemaBlock(newResult); });
基本上,每次调用都会.then()
将先前Promise的结果传递给新的异步函数,并返回该函数的Promise。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句