【问题标题】:Generatee unique id with生成唯一ID
【发布时间】:2015-09-26 16:26:17
【问题描述】:

我有以下代码:

function generateId() {
        var id = Math.floor(Math.random()*1000);
        var lastId = this.getLastAdvertId();
        var self = this;

        var promise = when.promise(function(resolve, reject) {

            if(id === lastId) self.generateAdvertId();

            if(lastId !== null){
                self.compareImages(id, lastId).then(function(result){
                    if(result) self.generateAdvertId();
                    else{
                        self.setLastAdvertId(id);
                        resolve(id);
                    }
                });
            }

            self.setLastAdvertId(id);
            resolve(id);

        });

        return promise;
}

这段代码“有效”,我遇到的问题就在这部分:

if(lastId !== null){
    self.compareImages(id, lastId).then(function(result){
        if(result) self.generateAdvertId();
        else{
            self.setLastAdvertId(id);
            resolve(id);
        }
    });
}

当两个图像相同时,结果为真,但没有生成新的 Id,而是返回了一个已生成的 Id。我在那里做错了什么?

【问题讨论】:

  • 在您的第一个代码示例的第二行中分配的 id 变量不会在代码中的其他任何地方修改。那是你所期待的吗。 self.generateAdvertId 是做什么的?
  • 问题是最终的resolve(id)总是被执行,所以self.compareImages ...then中的resolve(id)不会改变完整的Promise的值,因为一个Promise只能被解决或拒绝一次- 看起来你应该做类似id = self.generateAdvertId(); 而不仅仅是self.generateAdvertId(); 的事情 - 但很难说

标签: javascript promise


【解决方案1】:

不知道self.generateAdvertIdself.compareImages函数的具体细节,我只能猜测这是你需要做的

我假设 self.generateAdvertId 将返回 id - 否则您的代码没有那么大的意义 - 再次,只看到一个 sn-p 可能是原因

function generateId() {
    var id = Math.floor(Math.random()*1000);
    var lastId = this.getLastAdvertId();
    var self = this;

    if (id === lastId) {
        id = self.generateAdvertId();
    }

    if (lastId !== null) {
        return self.compareImages(id, lastId).then(function(result){
            if (result) {
                id = self.generateAdvertId(); // your original code looked like you (incorrectly) expected it to fall through to the setLastAdvertId/resolve at the bottom of the function,
            }
            self.setLastAdvertId(id);
            resolve(id);
        }); // this returns a promise
    }

    self.setLastAdvertId(id);
    return when.resolve(id); // return a promise with the resolved value = id
}

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2011-06-20
    相关资源
    最近更新 更多