如何创建一个新的承诺?
How to create a new promise?
好吧,我知道人们必须 return 一个承诺,而不是承诺传递承诺的结果。
但是我似乎无法实现这个,说我有一个像这样的成员方法:
CreateNextBatch() {
this.orders.clear();
let maxNum = this.maxNum;
let counter = this.orderCounter;
let CreateThem = (counter, r) => {
if (r >= 0) {
//Order.find() finds an entry in a database
Order
.find({orderNr: counter.fullNumber()})
.then(function(orders) {
console.log("created order " + counter.fullNumber().toString());
let num = r;
if (orders.length === 0) {
this.OpenOrder(counter.fullNumber());
//adds order to this.orders
num -= 1;
}
counter.nextNumber();
return CreateThem(counter, num);
}.bind(this))
.catch (function (err){
console.log(err);
return false;
});
} else {
return true;
}
};
return () => {CreateThem(counter, maxNum);};
}
基本上它以递归方式创建订单,在找到 this.MaxRequests
个空点后终止,然后将它们放在 this.orders
下的列表中
现在我调用了这个函数:
initialLoader.CreateNextBatch().then(function (success) {
console.log(success);
console.log("loaded");
initialLoader.initializeBatch();
});
但是这失败了:
TypeError: initialLoader.CreateNextBatch(...).then is not a function
at LoadExternDatabase...
为什么这不起作用?我还不明白什么?
编辑:我还尝试用新的承诺替换 return:
return new Promise((resolve, reject) => {
CreateThem(counter, maxRequests);
resolve();
});
然而,这会立即执行解析,而不是等待 CreateThem 完成。也不直接通过 return CreateThem.bind(this, counter, maxRequests);
的函数
return new Promise((resolve, reject) => {
globalVarKeep = resolve;
globalVarBreak = reject;
});
在此之前,您会有一些代码在等待一个承诺或一个事件,上面写着:-
CreateThem(counter, maxRequests);
globalVarKeep();
或
CreateThem(counter, maxRequests).then(globalVarKeep);
如果合适的话。
函数 initialLoader.CreateNextBatch()
return 是一个函数,不是一个承诺,你应该这样做:initialLoader.CreateNextBatch()()
函数 CreateThem
可以 return 如果 this.maxNum
>= 0 并且根据递归承诺为真或假。但并不总是保证 return 一个承诺。 () => {CreateThem(counter, maxNum);};
也没有 return 任何东西。您可以尝试以下方法:
CreateNextBatch() {
this.orders.clear();
let maxNum = this.maxNum;
let counter = this.orderCounter;
let CreateThem = (counter, r) => {
if (r >= 0) {
//Order.find() finds an entry in a database
//you can return a promise here
return Order
.find({orderNr: counter.fullNumber()})
.then(function(orders) {
console.log("created order " + counter.fullNumber().toString());
let num = r;
if (orders.length === 0) {
this.OpenOrder(counter.fullNumber());
//adds order to this.orders
num -= 1;
}
counter.nextNumber();
return CreateThem(counter, num);
}.bind(this))
.catch (function (err){
console.log(err);
return false;
});
} else {
return Promise.resolve(true);
}
};
//you are not returning CreateThem here
return () => {return CreateThem(counter, maxNum);};
}
你应该 resolve
在异步操作完成后一个承诺。
例如:
function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// Resolved here!
// Because asynchronous function `setTimeout` ends here
resolve();
}, 1000);
})
}
在您的代码中,如果 r >= 0
,它将再次在数据库中找到一个条目,直到 r
小于 0
,因此它在 else
块结束:
if (r >= 0) {
// ...
} else {
// ends here
}
也许您可以将代码更改为:
CreateNextBatch() {
return new Promise((resolve, reject) => {
this.orders.clear();
let maxNum = this.maxNum;
let counter = this.orderCounter;
let CreateThem = (counter, r) => {
if (r >= 0) {
//Order.find() finds an entry in a database
Order
.find({orderNr: counter.fullNumber()})
.then(function(orders) {
console.log("created order " + counter.fullNumber().toString());
let num = r;
if (orders.length === 0) {
this.OpenOrder(counter.fullNumber());
//adds order to this.orders
num -= 1;
}
counter.nextNumber();
return CreateThem(counter, num);
}.bind(this))
.catch (function (err){
console.log(err);
reject(err);
});
} else {
resolve(true);
}
};
});
// return () => {CreateThem(counter, maxNum);};
}
好吧,我知道人们必须 return 一个承诺,而不是承诺传递承诺的结果。
但是我似乎无法实现这个,说我有一个像这样的成员方法:
CreateNextBatch() {
this.orders.clear();
let maxNum = this.maxNum;
let counter = this.orderCounter;
let CreateThem = (counter, r) => {
if (r >= 0) {
//Order.find() finds an entry in a database
Order
.find({orderNr: counter.fullNumber()})
.then(function(orders) {
console.log("created order " + counter.fullNumber().toString());
let num = r;
if (orders.length === 0) {
this.OpenOrder(counter.fullNumber());
//adds order to this.orders
num -= 1;
}
counter.nextNumber();
return CreateThem(counter, num);
}.bind(this))
.catch (function (err){
console.log(err);
return false;
});
} else {
return true;
}
};
return () => {CreateThem(counter, maxNum);};
}
基本上它以递归方式创建订单,在找到 this.MaxRequests
个空点后终止,然后将它们放在 this.orders
现在我调用了这个函数:
initialLoader.CreateNextBatch().then(function (success) {
console.log(success);
console.log("loaded");
initialLoader.initializeBatch();
});
但是这失败了:
TypeError: initialLoader.CreateNextBatch(...).then is not a function
at LoadExternDatabase...
为什么这不起作用?我还不明白什么?
编辑:我还尝试用新的承诺替换 return:
return new Promise((resolve, reject) => {
CreateThem(counter, maxRequests);
resolve();
});
然而,这会立即执行解析,而不是等待 CreateThem 完成。也不直接通过 return CreateThem.bind(this, counter, maxRequests);
return new Promise((resolve, reject) => {
globalVarKeep = resolve;
globalVarBreak = reject;
});
在此之前,您会有一些代码在等待一个承诺或一个事件,上面写着:-
CreateThem(counter, maxRequests);
globalVarKeep();
或
CreateThem(counter, maxRequests).then(globalVarKeep);
如果合适的话。
函数 initialLoader.CreateNextBatch()
return 是一个函数,不是一个承诺,你应该这样做:initialLoader.CreateNextBatch()()
函数 CreateThem
可以 return 如果 this.maxNum
>= 0 并且根据递归承诺为真或假。但并不总是保证 return 一个承诺。 () => {CreateThem(counter, maxNum);};
也没有 return 任何东西。您可以尝试以下方法:
CreateNextBatch() {
this.orders.clear();
let maxNum = this.maxNum;
let counter = this.orderCounter;
let CreateThem = (counter, r) => {
if (r >= 0) {
//Order.find() finds an entry in a database
//you can return a promise here
return Order
.find({orderNr: counter.fullNumber()})
.then(function(orders) {
console.log("created order " + counter.fullNumber().toString());
let num = r;
if (orders.length === 0) {
this.OpenOrder(counter.fullNumber());
//adds order to this.orders
num -= 1;
}
counter.nextNumber();
return CreateThem(counter, num);
}.bind(this))
.catch (function (err){
console.log(err);
return false;
});
} else {
return Promise.resolve(true);
}
};
//you are not returning CreateThem here
return () => {return CreateThem(counter, maxNum);};
}
你应该 resolve
在异步操作完成后一个承诺。
例如:
function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// Resolved here!
// Because asynchronous function `setTimeout` ends here
resolve();
}, 1000);
})
}
在您的代码中,如果 r >= 0
,它将再次在数据库中找到一个条目,直到 r
小于 0
,因此它在 else
块结束:
if (r >= 0) {
// ...
} else {
// ends here
}
也许您可以将代码更改为:
CreateNextBatch() {
return new Promise((resolve, reject) => {
this.orders.clear();
let maxNum = this.maxNum;
let counter = this.orderCounter;
let CreateThem = (counter, r) => {
if (r >= 0) {
//Order.find() finds an entry in a database
Order
.find({orderNr: counter.fullNumber()})
.then(function(orders) {
console.log("created order " + counter.fullNumber().toString());
let num = r;
if (orders.length === 0) {
this.OpenOrder(counter.fullNumber());
//adds order to this.orders
num -= 1;
}
counter.nextNumber();
return CreateThem(counter, num);
}.bind(this))
.catch (function (err){
console.log(err);
reject(err);
});
} else {
resolve(true);
}
};
});
// return () => {CreateThem(counter, maxNum);};
}