W kodzie jest promise.then, który próbuje być używany do ustawienia zmiennej globalnej originalUrl, jednak originalUrl nie jest zmieniana. Każda pomoc byłaby bardzo doceniana.

MyApp.js:

// create a mongoose model
var urlSchema = new mongoose.Schema({
  original_url: String,
  short_url: String
});
urlSchema.plugin(findOrCreate)
var Url = mongoose.model('Url', urlSchema);

let promise = new Promise(function(resolve, reject) {
  app.post("/api/shorturl/new", (req, res) => {
    // receive an url in the post and return a
    // short id. After that, the short id can be used
    // to go to the original url.
    // Handle the data in the POST request
    // get the hostname from the request
    
    originalUrl = req.body.url;
    // Create an identifier for the url
    shortUrl = md5(originalUrl).toString().slice(-7) 
    
     // test to see if the host is live
    var url = new URL(originalUrl);
    hostname = url.hostname;

    // if host is live
    dns.lookup(hostname, function (err) {
      if (err == undefined){
        // if not found, save the original_url and the 
        // short_url, return
          Url.findOrCreate({ original_url: originalUrl, short_url: shortUrl}, (err, result) => {
          console.log(result)

          res.json({
          original_url: originalUrl,
          short_url: shortUrl
          }); 
        })
      }

      if (err != undefined){
        console.log(">>> error <<<")
        res.json({"error":"host down"});
      }
    });
    resolve(originalUrl)
  });
})
promise.then(
  function(result) { originalUrl = result },
  function(error) { /* handle an error */ }
);

console.log(originalUrl) // undefined

-1
65535 5 październik 2020, 06:49

1 odpowiedź

Najlepsza odpowiedź

Kod w funkcji przekazany do then() nie jest uruchomiony, dopóki obietnica się rozwiąża. Więc zamiast tego:

promise.then(
  function(result) { originalUrl = result },
  function(error) { /* handle an error */ }
);

console.log(originalUrl)

... musisz zrobić coś więcej:

promise.then(
  function(result) { originalUrl = result },
  function(error) { /* handle an error */ }
).then(
  function() { console.log(originalUrl); }
);

Oto prosta zrównoważona próbka, która miejmy nadzieję, że daje pomysł, jak to działa:

var originalUrl = undefined;

var promise = new Promise((resolve, reject) => {
  setTimeout( function() {
    resolve("http://example.com");
  }, 250) 
});

promise.then(
  function(result) { originalUrl = result },
  function(error) { /* handle an error */ }
).then(
  function() { console.log('promise resolved: ', originalUrl); }
);
console.log('promise pending: ', originalUrl);

Wyniki:

promise pending:  undefined
promise resolved:  http://example.com
1
Trott 5 październik 2020, 04:01