[英]How to create a new promise?
Well I understand that one would have to return a promise, and not the result of a promise to pass promises around. 好吧,我知道,一个人必须返回一个承诺,而不是一个将承诺传递出去的结果。
However I seem to be unable to implement this, say I have a member method like: 但是我似乎无法实现这一点,说我有一个像这样的成员方法:
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);};
}
Basically it creates orders in a recursive fashion, terminating after finding this.MaxRequests
empty spots and then puts them together in a list under this.orders
基本上,它以递归的方式创建订单,找到后终止this.MaxRequests
空点,然后将它们放到this.orders
下的列表中
Now I called this function by: 现在,我通过以下方式调用此函数:
initialLoader.CreateNextBatch().then(function (success) {
console.log(success);
console.log("loaded");
initialLoader.initializeBatch();
});
However this fails: 但是,这失败了:
TypeError: initialLoader.CreateNextBatch(...).then is not a function
at LoadExternDatabase...
Why isn't this working? 为什么这不起作用? What am I not understanding yet? 我还不了解什么?
Edit: I've also tried to replace the return by a new promise: 编辑:我也试图用新的诺言代替回报:
return new Promise((resolve, reject) => {
CreateThem(counter, maxRequests);
resolve();
});
However this executes the resolve immediatelly, instead of waiting for CreateThem to complete. 但是,这将立即执行解析,而不是等待CreateThem完成。 Nor directly the function by return CreateThem.bind(this, counter, maxRequests);
也不能直接通过return CreateThem.bind(this, counter, maxRequests);
函数return CreateThem.bind(this, counter, maxRequests);
return new Promise((resolve, reject) => {
globalVarKeep = resolve;
globalVarBreak = reject;
});
Before that you would have had some code waiting for a promise or an event that says: - 在此之前,您将需要一些代码来等待一个承诺或事件,该事件说:-
CreateThem(counter, maxRequests);
globalVarKeep();
or 要么
CreateThem(counter, maxRequests).then(globalVarKeep);
If that's appropriate. 如果合适的话。
The function initialLoader.CreateNextBatch()
returns a function, not a promise, you should do: initialLoader.CreateNextBatch()()
函数initialLoader.CreateNextBatch()
返回一个函数,而不是initialLoader.CreateNextBatch()()
,您应该这样做: initialLoader.CreateNextBatch()()
The function CreateThem
can return true if this.maxNum
>= 0 and a promise of true or false depending on the recursion. 如果this.maxNum
> = 0,则函数CreateThem
可以返回true,并且根据递归可以返回true或false。 But doesn't allways guaranteed return a promise. 但是并不总是保证退还诺言。 And () => {CreateThem(counter, maxNum);};
和() => {CreateThem(counter, maxNum);};
doesn't return anything either. 也不会返回任何东西。 You could try the following: 您可以尝试以下方法:
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);};
}
You should resolve
a promise after the asynchronous operation done. 异步操作完成后,您应该resolve
一个Promise。
For example: 例如:
function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// Resolved here!
// Because asynchronous function `setTimeout` ends here
resolve();
}, 1000);
})
}
In your code, if r >= 0
, it will find an entry in database again until r
less than 0
, so it ends at else
block: 在您的代码中,如果r >= 0
,它将再次在数据库中找到一个条目,直到r
小于0
为止,因此它在else
块处结束:
if (r >= 0) {
// ...
} else {
// ends here
}
Maybe you could change your code to: 也许您可以将代码更改为:
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);};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.