执行单行代码后解决承诺

时间:2017-12-26 23:07:42

标签: javascript typescript promise

我有一系列事件我正在尝试对齐,但我不明白如何在一行异步代码之后解决一个承诺。在这种情况下,我正在进行API调用,该调用解析为一个对象数组。然后我使用Object.assign()将对象数组转换为对象对象。一旦完成,我就想调用一个函数来处理对象的新对象。转换过程需要一些时间,我不知道如何在转换对象之前推迟我的函数调用。我的无效代码如下所示。

example [] [] = Nothing
example xl yl = Just $ sum $ zipWith (*) xl yl

2 个答案:

答案 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();
});