Javascript 生成一个唯一的id

Javascript 生成一个唯一的id,javascript,promise,Javascript,Promise,我有以下代码: 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

我有以下代码:

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);
        }
    });
}

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

在不知道
self.generateAdvertId
self.compareImages
函数的细节的情况下,我只能猜测这是您需要做的

我假设
self.generateAdvertId
将返回一个
id
——否则你的代码就没那么有意义了——同样,仅仅看到一个片段可能就是原因

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
}

在第一个代码示例的第二行中指定的
id
变量不会在代码中的任何其他位置进行修改。这就是你所期待的吗。
self.generateAdvertId
有什么作用?避免!问题是最终的
resolve(id)
总是在执行,因此
self.compareImages中的
resolve(id)
将不会更改完整承诺的值,因为承诺只能解决或拒绝一次-看起来您还应该执行类似
id=self.generateAdvertId()的操作而不仅仅是
self.generateAdvertId()-但很难说