我有一系列事件我正在尝试对齐,但我不明白如何在一行异步代码之后解决一个承诺。在这种情况下,我正在进行API调用,该调用解析为一个对象数组。然后我使用Object.assign()将对象数组转换为对象对象。一旦完成,我就想调用一个函数来处理对象的新对象。转换过程需要一些时间,我不知道如何在转换对象之前推迟我的函数调用。我的无效代码如下所示。
example [] [] = Nothing
example xl yl = Just $ sum $ zipWith (*) xl yl
答案 0 :(得分:3)
#include "Arduino.h"
class TestObject {
private:
char name[20];
TestObject* child;
public:
TestObject(const char* name);
virtual ~TestObject();
void setChild(TestObject h) ;
char *getName();
};
TestObject::TestObject(const char *name) {
child = (TestObject*)0;
strcpy(this->name,name);
}
TestObject::~TestObject() {
Serial.println("Out of scope name="+String(name));
}
char *TestObject::getName() {
return name;
}
void TestObject::setChild(TestObject h ) {
child = &h;
Serial.println("adding "+String(h.name)+" to "+String(name));
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\nStarting");
TestObject root = TestObject("root");
TestObject child = TestObject("child");
root.setChild(child); // child destructor is called here but it should still be in scope
delay(1000);
TestObject root2 = TestObject("root2");
root2.setChild(child);// child destructor is called a second time here
Serial.println("Done, both root and child should still be in scope");
while(true) {
delay(10000);
}
}
异步操作的结果,而不是要执行的代码。您要执行的代码不应该放在resolve
参数中,而应放在您给promise构造函数的回调中。所以对于你的片段:
resolve
还值得注意的是,您不需要使用承诺构造函数,因为您已经开始链接承诺。你可以:
this.queryCodes().then(() => {
return new Promise((resolve) => {
// Put the code you want to execute here...
// Call resolve when your work is done, and pass it the result if there is one.
resolve(/* maybe result here */);
}).then((data) => {
this.resolveCodesToDescriptions();
});
});
答案 1 :(得分:1)
resolve()
不会将回调作为参数。它将解析后的值作为参数。不知道你从哪里获得回调概念。这就是为什么永远不会调用回调的原因,因为它不是resolve()
支持的功能。
可能不需要在.then()
处理程序中手动创建承诺,可能是anti-pattern。你没有在这里显示足够的真实代码来了解发生了什么,但这可能比它需要的更复杂。从您显示的代码中,我认为您可以这样做:
this.queryCodes().then(() => {
this.floorCodesLookup = Object.assign({}, ...this.floorCodes);
this.resolveCodesToDescriptions();
});